package persistencia;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import logica.Area;
import logica.Articulo;
import logica.UsuarioRegistrado;
import excepciones.DAOExcepcion;

public class ArticuloDAOImp extends GenericHSQLDB implements IArticuloDAO {

	private AreaDAOImp aDAO = new AreaDAOImp();
	private UsuarioRegistradoDAOImp urDAO = new UsuarioRegistradoDAOImp();

	public ArticuloDAOImp() throws DAOExcepcion {
		super();
	}

	public void crearArticulo(Articulo a) throws DAOExcepcion {

		try {

			connManager.connect();

			connManager
					.updateDB("insert into ARTICULO (TITULO, FECHA_ENVIO, RUTA_FICHERO, NOMBRE_FICHERO, NOMBRE_USUARIO, NOMBRE_AREA) values ('"
							+ a.getTitulo()
							+ "', '"
							+ a.getFecha_envio()
							+ "', '"
							+ a.getRuta_fichero()
							+ "', '"
							+ a.getNombre_fichero()
							+ "', '"
							+ a.getResponsable_envio().getNombreUsuario()
							+ "', '"
							+ a.getPertenece_a().getNombre() + "')");

			connManager.close();

			if (a.getEvaluacion() != null) {

			}

		} catch (DAOExcepcion e) {
			throw e;
		}
	}

	public List<Articulo> encontrarArticulosPendientesPorArea(String nombreUsuario) throws DAOExcepcion {

		try {

			connManager.connect();

			ResultSet rs = connManager.queryDB("select * from ARTICULO where P_EVALUACION=TRUE AND NOMBRE_AREA= '"
					+ area.getNombre() + "'");

			connManager.close();

			List<Articulo> listaArticulosPendientes = new ArrayList<Articulo>();
			try {
				while (rs.next()) {

					UsuarioRegistradoDAOImp urDAO = new UsuarioRegistradoDAOImp();
					UsuarioRegistrado u = urDAO.encontrarUsuarioRegistradoPorNombreUsuario(rs
							.getString("NOMBRE_USUARIO"));

					Articulo a = new Articulo(rs.getString("TITULO"), rs.getString("FECHA_ENVIO"),
							rs.getString("RUTA_FICHERO"), rs.getString("NOMBRE_FICHERO"), u, area);

					listaArticulosPendientes.add(a);
				}

				return listaArticulosPendientes;

			} catch (SQLException e) {
				throw new DAOExcepcion("DB_READ_ERROR");
			}

		} catch (DAOExcepcion e) {
			throw e;
		}
	}

	/* encontrar o actualiza? */
	public void encontrarArticulosPorTitulo(String titol) throws DAOExcepcion {
		connManager.connect();
		connManager.queryDB("update ARTICULO set P_EVALUACION=0,P_PUBLICACION=1 where TITULO= '" + titol + "'");
		connManager.close();
	}

	public void rechazarArticuloPorTitulo(String titol) throws DAOExcepcion {
		/*
		 * Desapareix el article de la llista de pendents devaluacio i el
		 * article queda exclos, es podria borrar de la BD?
		 */
		connManager.connect();
		connManager.queryDB("update ARTICULO set P_EVALUACION=0 where TITULO= '" + titol + "'");
		connManager.close();
	}

	public void publicarArticulosPorTitulo(String titol) throws DAOExcepcion {
		connManager.connect();
		connManager.queryDB("update ARTICULO set P_PUBLICACION=0, P_EJEMPLAR=1 where TITULO= '" + titol + "'");
		connManager.close();
	}

	public List<Articulo> encontrarArticulosEvaluados(String nombreUsuario) throws DAOExcepcion {

		try {
			Area area = aDAO.encontrarAreaPorNombreUsuario(nombreUsuario);
			connManager.connect();
			ResultSet rs = connManager.queryDB("select * from ARTICULO where P_PUBLICACION=TRUE AND NOMBRE_AREA= '"
					+ area.getNombre() + "'");
			connManager.close();
			List<Articulo> listaArticulosPendientes = new ArrayList<Articulo>();
			try {
				while (rs.next()) {
					UsuarioRegistrado u = urDAO.encontrarUsuarioRegistradoPorNombreUsuario(rs
							.getString("NOMBRE_USUARIO"));
					Articulo a = new Articulo(rs.getString("TITULO"), rs.getString("FECHA_ENVIO"),
							rs.getString("RUTA_FICHERO"), rs.getString("NOMBRE_FICHERO"), u, area);
					listaArticulosPendientes.add(a);
				}
				return listaArticulosPendientes;
			} catch (SQLException e) {
				throw new DAOExcepcion("DB_READ_ERROR");
			}
		} catch (DAOExcepcion e) {
			throw e;
		}
	}
}
